Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a setting for enabling iterator caching #263

Merged
merged 1 commit into from
Jan 16, 2025

Conversation

danlamanna
Copy link
Contributor

Fixes #256

Description

This adds a setting to enable caching query results when they're generators.

Rationale

Caching iterators causes OOM errors as documented in #256 when using QuerySet.iterator for large result sets because of list coercion.

I defaulted this setting to False since I think that's less surprising behavior, but this does change the existing behavior, so it would be a breaking change. Let me know if I should invert it to cache iterators by default as it currently does.

@danlamanna
Copy link
Contributor Author

@Andrew-Chen-Wang Thoughts on this?

@danlamanna
Copy link
Contributor Author

Gentle bump - any updates on this?

Comment on lines -247 to -249
with self.assertNumQueries(1):
with self.assertNumQueries(2):
data1 = list(Test.objects.iterator())
with self.assertNumQueries(0):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why did you remove these assertions?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think I did. Since I defaulted the setting to False this should run 2 queries. The below block now does what this block did before.

@Andrew-Chen-Wang Andrew-Chen-Wang merged commit 8d5a159 into noripyt:master Jan 16, 2025
22 checks passed
@Andrew-Chen-Wang
Copy link
Collaborator

lgtm thank you

@Andrew-Chen-Wang
Copy link
Collaborator

thx for this. I don't think it's a breaking change albeit a changing behavior. As they say, don't add performance improvements until you notice performance hits. If people notice a slowdown, I'm sure they can check the CHANGELOG to see this change and re-enable the setting.

@danlamanna danlamanna deleted the iterators branch January 16, 2025 15:24
danlamanna added a commit to ImageMarkup/isic that referenced this pull request Jan 16, 2025
The latest version of django-cachalot disables caching iterators by
default. See noripyt/django-cachalot#263.
danlamanna added a commit to ImageMarkup/isic that referenced this pull request Jan 21, 2025
The latest version of django-cachalot disables caching iterators by
default. See noripyt/django-cachalot#263.
danlamanna added a commit to ImageMarkup/isic that referenced this pull request Jan 21, 2025
The latest version of django-cachalot disables caching iterators by
default. See noripyt/django-cachalot#263.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Out of memory error when using queryset iterator
2 participants